import grails.plugins.springsecurity.SpringSecurityService
import groovy.sql.Sql

import org.joda.time.LocalDate

import br.com.insoft4.core.types.SimNao
import br.com.insoft4.framework.Idioma
import br.com.insoft4.framework.Menu
import br.com.insoft4.framework.MenuPerfil
import br.com.insoft4.framework.Perfil
import br.com.insoft4.framework.PerfilUsuario
import br.com.insoft4.framework.Programa
import br.com.insoft4.framework.Usuario
import br.feevale.ihc.Atividade
import br.feevale.ihc.AtividadeColaborador
import br.feevale.ihc.Colaborador
import br.feevale.ihc.Equipe
import br.feevale.ihc.Projeto


class BootStrap {

	SpringSecurityService springSecurityService
	def dataSource
	
    def init = { servletContext ->
		
		Sql sql = new Sql(dataSource.getConnection())
		sql.execute("CREATE SEQUENCE IN4FW_SEQ_SESSAO")
		
		initFramework()
		initData()
    }
	
	void initData() {
		List projetos = [
			[id: 1, descricao: 'PROJETO 1', horasPrevistas: 300D],
			[id: 2, descricao: 'PROJETO 2', horasPrevistas: 150D],
		]
		
		projetos.each { Map proj ->
			Projeto projeto = new Projeto()
			projeto.id = proj.id
			projeto.descricao = proj.descricao
			projeto.horasPrevistas = proj.horasPrevistas
			assert projeto.save(flush: true)
		}
		
		List atividades = [
			[id: 1, descricao: 'ATIVIDADE 1', projeto: Projeto.get(1)],
			[id: 2, descricao: 'ATIVIDADE 2', projeto: Projeto.get(1)],
			[id: 3, descricao: 'ATIVIDADE 3', projeto: Projeto.get(1)],
			[id: 4, descricao: 'ATIVIDADE 1', projeto: Projeto.get(2)],
			[id: 5, descricao: 'ATIVIDADE 2', projeto: Projeto.get(2)],
		]
		
		atividades.each { Map ativ ->
			Atividade atividade = new Atividade()
			atividade.id = ativ.id
			atividade.descricao = ativ.descricao
			atividade.projeto = ativ.projeto
			assert atividade.save(flush: true)			
		}
		
		List equipes = [
			[id: 1, nome: 'DESENVOLVIMENTO'],
			[id: 2, nome: 'ANÁLISE']
		]
		
		equipes.each { Map eq ->
			Equipe equipe = new Equipe()
			equipe.id = eq.id
			equipe.nome = eq.nome
			assert equipe.save(flush: true)			
		}
		
		List colaboradores = [
			[id: 1, nome: 'RICHARD MATEUS ALTMAYER', email: 'richardmateus@gmail.com', equipe: Equipe.get(1), usuario: Usuario.findByLogin("RICHARD")],
			[id: 2, nome: 'TIO ZÉ', email: 'tioze@gmail.com', equipe: Equipe.get(1)],
			[id: 3, nome: 'JOSÉ DAS COUVES', email: 'josedascouves@gmail.com', equipe: Equipe.get(2)],
			[id: 4, nome: 'JOÃO DAS CONSERVAS', email: 'joaodasconservas@gmail.com', equipe: Equipe.get(2)],
		]
		
		colaboradores.each { Map col ->
			Colaborador colaborador = new Colaborador()
			colaborador.id = col.id
			colaborador.nome = col.nome
			colaborador.email = col.email
			colaborador.equipe = col.equipe
			colaborador.usuario = col.usuario
			assert colaborador.save(flush: true)
		}
		
		List atividadesColaboradores = [
			[id: 1, colaborador: Colaborador.get(1), atividade: Atividade.get(1)],
			[id: 2, colaborador: Colaborador.get(1), atividade: Atividade.get(3)],
			[id: 3, colaborador: Colaborador.get(2), atividade: Atividade.get(2)]
		]
		
		atividadesColaboradores.each { Map ativCol ->
			AtividadeColaborador atividadeColaborador = new AtividadeColaborador()
			atividadeColaborador.id = ativCol.id
			atividadeColaborador.atividade = ativCol.atividade
			atividadeColaborador.colaborador = ativCol.colaborador
			assert atividadeColaborador.save(flush: true)
		}
		
	}
	
	void initFramework() {
		List usuarios = [
			[login: 'ADMINISTRADOR', senha: springSecurityService.encodePassword("ADMINISTRADOR"), nome: 'ADMINISTRADOR DO SISTEMA', email: 'richard@insoft4.com.br'],
			[login: 'ADMIN', senha: springSecurityService.encodePassword("ADMIN"), nome: 'ADMINISTRADOR', email: 'richard@insoft4.com.br'],
			[login: 'RICHARD', senha: springSecurityService.encodePassword("RICHARD"), nome: 'RICHARD ALTMAYER', email: 'richard@insoft4.com.br']
		]

		usuarios.each { Map us ->
			Usuario usuario = new Usuario(us)
			assert usuario.save(flush: true)
		}

		List idiomas = [
			[sigla: 'pt_BR', descr: 'Português'],
			[sigla: 'es_AR', descr: 'Español'],
			[sigla: 'en_US', descr: 'English']
		]
		
		idiomas.each { Map i ->
			Idioma idioma = new Idioma(sigla: i.sigla, descr: i.descr)
			assert idioma.save(flush:true)
		}
		
		List programas = [
			[cod: 'IHC001', descr: 'Projetos e Atividades', chave: 'ihc.projetos.mainTitle', modulo: 'ihc.cadastros'],
			[cod: 'IHC002', descr: 'Equipes e Colaboradores', chave: 'ihc.equipes.mainTitle', modulo: 'ihc.cadastros'],
			[cod: 'IHC003', descr: 'Atividades por Colaboradores', chave: 'ihc.projetos.colaboradores.mainTitle', modulo: 'ihc.processos'],
			[cod: 'IHC004', descr: 'Marcações', chave: 'ihc.projetos.marcacoes.mainTitle', modulo: 'ihc.processos']
		]

		programas.each { Map prg ->
			Programa programa = new Programa(prg)
			assert programa.save(flush: true)
		}

		List menus = [
			[chave: 'menu.ihc.label', descr: 'Análise Produtividade', edt: '1', programa: null],
			[chave: 'menu.ihc.cadastros.projetos.label', descr: 'Projetos e Atividades', edt: '1.1', programa: 'IHC001'],
			[chave: 'menu.ihc.cadastros.atividades.label', descr: 'Equipes e Colaboradores', edt: '1.2', programa: 'IHC002'],
			[chave: 'menu.ihc.processos.atividades.colaboradores.label', descr: 'Atividades por Colaboradores', edt: '1.3', programa: 'IHC003'],
			[chave: 'menu.ihc.processos.marcacoes.label', descr: 'Marcações', edt: '1.4', programa: 'IHC004']
		]
		
		menus.each { Map men ->
			Menu menu = new Menu(chave: men.chave, descr: men.descr, edt: men.edt)
			if (men.programa) {
				menu.programa = Programa.findByCod(men.programa)
			}

			assert menu.save()
		}
		
		Perfil administrador = new Perfil(descr: 'ADMINISTRADORES DO SISTEMA', admin: new SimNao(valor: 'S'))
		assert administrador.save(flush:true)
		
		Perfil admin = new Perfil(descr: "ADMINISTRADORES", admin: new SimNao(valor: "N"))
		assert admin.save(flush: true)
		
		Perfil user = new Perfil(descr: 'USUARIOS', admin: new SimNao(valor: 'N'))
		assert user.save(flush:true)

		PerfilUsuario pf1 = new PerfilUsuario(perfil: administrador, usuario: Usuario.findByLogin('ADMINISTRADOR'), dataInicial: new LocalDate())
		assert pf1.save(flush: true)

		PerfilUsuario pf2 = new PerfilUsuario(perfil: admin, usuario : Usuario.findByLogin("ADMIN"), dataInicial: new LocalDate())
		assert pf2.save(flush: true)
		
		PerfilUsuario pf3 = new PerfilUsuario(perfil: user, usuario: Usuario.findByLogin('RICHARD'), dataInicial: new LocalDate())
		assert pf3.save(flush: true)
		
		MenuPerfil mp1 = new MenuPerfil(perfil: admin, menu: Menu.findByEdt("1"))
		assert mp1.save(flush: true)
		
		MenuPerfil mp2 = new MenuPerfil(perfil: admin, menu: Menu.findByEdt("1.1"))
		assert mp2.save(flush: true)
		
		MenuPerfil mp3 = new MenuPerfil(perfil: admin, menu: Menu.findByEdt("1.2"))
		assert mp3.save(flush: true)
		
		MenuPerfil mp4 = new MenuPerfil(perfil: admin, menu: Menu.findByEdt("1.3"))
		assert mp4.save(flush: true)
		
		MenuPerfil mp5 = new MenuPerfil(perfil: user, menu: Menu.findByEdt("1"))
		assert mp5.save(flush: true)
		
		MenuPerfil mp6 = new MenuPerfil(perfil: user, menu: Menu.findByEdt("1.4"))
		assert mp6.save(flush: true)

	}
	
    def destroy = {}
}
